package cn.com.csg.smartenergy.mqtt;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

/**
 * 用于订阅设备Topic
 *
 * @author ysguo
 * @date 2019-07-24
 */
@Data
@Slf4j
public abstract class AbstractCallBack implements MqttCallback {

    private AbstractMqttClient client;

    /**
     * 连接丢失回调方法
     *
     * @param throwable
     */
    @Override
    public void connectionLost(Throwable throwable) {
        // 重新new上一个client_id相同的MqttClient，client_id是MQTT client的唯一标识，client_id不能重复。
        // 这样就会出现重连时创建的MqttClient，使程序中初始化时创建的MqttClient断开连接，断开连接后就会回滚到connectionLost方法中，
        // 然后此方法中又会继续重连，就出现上述的断开连接再重连再断开连接再重连的死循环。
        log.info(String.format("连接断开：ClientId: %s", this.client.getClientId()));
        while (true) {
            try {
                Thread.sleep(15000);
                this.client.connect(client.getClientId(), this);
                for (String topic : client.getSubTopics()) {
                    this.client.subscribe(topic, 1);
                }
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 消息接收回调方法
     *
     * @param topic 主题
     * @param message 消息
     */
    @Override
    public abstract void messageArrived(String topic, MqttMessage message) throws MqttException;

    /**
     * 消息传输完成回调方法
     *
     * @param iMqttDeliveryToken token
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
    }
}
